// This library provides WebAssembly bindings for the FreeCAD's geometric solver library planegcs.
// Copyright (C) 2023  Miroslav Šerý, Salusoft89 <miroslav.sery@salusoft89.cz>  
// Copyright (C) 2023  Jiří Hon, Salusoft89 <jiri.hon@salusoft89.cz>  

// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.

// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

import { {% for enum_name in import_enums %}{{ enum_name }}, {% endfor -%} } from "./enums";

export interface DoubleVector {
    get: (i: number) => number;
    size: () => number;
    delete: () => void;
    push_back: (val: number) => void;
}
export interface IntVector {
    get: (i: number) => number;
    size: () => number;
    delete: () => void;
    push_back: (val: number) => void;
}

{%- for cls in geom_classes -%}
{% if cls.base %}
export type {{ cls.name }} = {{ cls.base }};
{%- else %}
export interface {{ cls.name }} {
    delete: () => void;
}
{%- endif %}
{%- endfor %}

export type GcsGeometry = {% for cls in geom_classes %}{{ cls.name }}{% if not loop.last %} | {% endif %}{% endfor %};

export interface GcsSystem {
{% for func in fn_ts_bindings %}
    {{ func.fname }}: ({{ func.args }}) => {{ func.return_type }};
{%- endfor %}
    delete: () => void;
}

export interface GcsSystemConstructor {
    new (): GcsSystem;
}

export interface DoubleVectorConstructor {
    new (): DoubleVector;
}

export interface IntVectorConstructor {
    new (): IntVector;
}